package Iterator_pattern.ex1;

/**
 * @author 申书航
 * @version 1.0
 *
 * 珍宝箱物品迭代器类，实现了ItemIterator接口，用于迭代珍宝箱中的物品。
 */
public class TreasureChestItemIterator implements ItemIterator {

    private int idx;

    private final TreasureChest chest;

    private final ItemType type;

    /**
     * 构造函数，初始化珍宝箱和物品类型，并找到下一个可迭代的物品索引。
     *
     * @param chest 珍宝箱对象
     * @param type  物品类型
     */
    public TreasureChestItemIterator(TreasureChest chest, ItemType type) {
        this.chest = chest;
        this.type = type;
        this.idx = -1;
        this.idx = findNext();
    }

    /**
     * 查找下一个符合条件的物品索引。
     *
     * @return 下一个符合条件的物品索引
     */
    private int findNext() {
        //判断是否已经到达最后一个物品
        if (idx >= chest.getItems().size() - 1) {
            return chest.getItems().size();
        }
        //根据物品类型查找下一个符合条件的物品索引
        if (type == ItemType.ANY) {
            return idx + 1;
        }
        else {
            //默认找不到符合条件的物品
            int nextIdx = chest.getItems().size();
            //遍历所有物品，找到第一个符合条件的物品
            for (int i = idx + 1; i < chest.getItems().size(); i++) {
                if (chest.getItems().get(i).getType() == type) {
                    nextIdx = i;
                    break;
                }
            }
            return nextIdx;
        }
    }


    @Override
    /**
     * 检查是否还有下一个物品可以迭代。
     *
     * @return 如果还有下一个物品可迭代，返回true；否则返回false
     */
    public boolean hasNext() {
        return idx != chest.getItems().size();
    }

    @Override
    /**
     * 返回下一个物品并更新索引。
     *
     * @return 下一个物品
     */
    public Item next() {
        Item item = chest.getItems().get(idx);
        this.idx = findNext();
        return item;
    }
}

